package tcp.project;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

/*
    TCP服务器端：接收客户端的请求，读取客户端发送的数据，并给客户端回写数据
    表示服务器端的类：ServerSocket：实现服务器套接字

    构造方法：ServerSocket （int port）：创建绑定到指定端口号的服务器套接字

    使用服务器必须明确一件事：必须知道是哪个客户端请求的服务器，所以需要使用accept（）方法获取到请求的服务器

    成员方法：Socket accept（）：获取并连接请求的客户端对象，返回值类型为Socket

    实现步骤：代码需要抛出异常
             1.创建服务器ServerSocket对象，构造方法中绑定系统要指定的端口号（发出请求的客户端的端口号）
             2.使用ServerSocket对象的accept（）方法，获取到请求的客户端对象Socket,返回值类型为Socket(获取到客户端才可使用其中的IO流)
             （因为服务器本身没有IO流方法，所以需要用客户端的方法来使用IO流）
             3.使用Socket对象中的getInputStream（）方法获取网络字节输出流InputStream对象
             4.使用网络字节 输出流 InputStream对象中的read（）方法，读取客户端发送的数据
             5.使用Socket对象中的getOutputStream（）方法获取网络字节输出流OutputStream对象
             6.使用网络字节 输出流 OutputStream对象中的write（）方法，给客户端回写数据
             7.释放资源（先Socket，后ServerScoket）

    服务器启动后再执行客户端
 */
public class Server {
    public static void main(String[] args) throws IOException {
        //1.创建服务器ServerSocket对象，构造方法中绑定系统要指定的端口号（发出请求的客户端的端口号）
        ServerSocket ss = new ServerSocket(8580);

        // 2.使用ServerSocket对象的accept（）方法，获取到请求的客户端对象Socket,返回值类型为Socket
        Socket accept = ss.accept();

        //3.使用Socket对象中的getInputStream（）方法获取网络字节输出流InputStream对象(获取到客户端才可使用其中的IO流)
        InputStream inputStream = accept.getInputStream();

        // 4.使用网络字节 输出流 InputStream对象中的read（）方法，读取客户端发送的数据
        byte [] bytes = new byte[1024];//用数组接收读取内容
        int len = inputStream.read(bytes);//读取的内容长度
        System.out.println(new String(bytes,0,len));//以字符串的形式打印

        // 5.使用Socket对象中的getOutputStream（）方法获取网络字节输出流OutputStream对象
        OutputStream outputStream = accept.getOutputStream();

        // 6.使用网络字节 输出流 OutputStream对象中的write（）方法，给客户端回写数据
        outputStream.write("已收到".getBytes());

        //  7.释放资源（先Socket，后ServerSocket）
        accept.close();
        ss.close();
    }
}
